/*
 * Copyright (c) [2022] [王鹏欢]
 *    [DataStructure] is licensed under Mulan PSL v2.
 *    You can use this software according to the terms and conditions of the Mulan PSL v2.
 *    You may obtain a copy of Mulan PSL v2 at:
 *             http://license.coscl.org.cn/MulanPSL2
 *    THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 *    See the Mulan PSL v2 for more details.
 */

package com.huan.sequence;


public class SequenceList {
    private Object listelem[];          //线性表存储空间
    private int curlen;                 //线性表当前长度

    /**
     * 设置顺序表长度为0
     *
     * @param maxsize 为顺序表分配maxsize个存储单元
     */
    public SequenceList(int maxsize)
    {
        curlen   = 0;                       //置顺序表长度为0
        listelem = new Object[maxsize];   //为顺序表分配maxsize个存储单元
    }

    /**
     * 将一个已存在的顺序表置成空表
     */
    public void clear()
    {
        curlen = 0;
    }

    /**
     * 判断表中元素个数是否为0，
     * @return 若为0返回true否则返回false
     */
    public boolean isEmpty()
    {
        return curlen == 0;
    }

    /**
     * 求顺序表中数据元素个数并返回其值
     *
     * @return 元素个数
     */
    public int length()
    {
        return curlen;
    }

    /**
     * 查找顺序表第i个位置元素并返回其值
     * @param i 位置下标
     * @return 对应下标值
     * @throws Exception 位置出错
     */
    public Object get(int i) throws Exception
    {
        if (i < 0 || i > curlen)
            throw new Exception("查找位置不合理");
        return listelem[i];
    }

    /**
     * 在顺序表中第i个位置元素之前插入值为x的元素
     * @param i 位置下标
     * @param x 值为x
     * @throws Exception 顺序已满、位置不合理
     */
    public void insert(int i, Object x) throws Exception
    {
        if (curlen == listelem.length)
            throw new Exception("顺序表已满");
        if (i < 0 || i > curlen)
            throw new Exception("插入位置不合理");
        for (int j = curlen; j > i; j--)
             listelem[j] = listelem[j - 1];
        listelem[i] = x;
        curlen++;
    }

    /**
     * 删除顺序表第i个位置的元素
     * @param i 位置下标
     * @throws Exception 位置不合理
     */
    public void remove(int i) throws Exception
    {
        if (i < 0 || i > curlen - 1)
            throw new Exception("删除位置不合理");
        for (int j = i; j < curlen; j++)
             listelem[j] = listelem[j + 1];
        curlen--;
    }

    /**
     * 输出顺序表中的数据元素
     */
    public void display()
    {
        for (int i = 0; i < curlen; i++)
             System.out.println(listelem[i]);
    }

    /**
     * 返回顺序表中首次出现指定数据元素的位序号
     * @param x 指定元素
     * @return 位序号
     */
    public int indexof(Object x)
    {
        int j = 0;
        while (j < curlen && !listelem[j].equals(x)) {
            j++;
        }
        if (j < curlen)
            return j;
        else
            return -1;
    }


    public static void main(String[] args) throws Exception
    {
        SequenceList L = new SequenceList(10);          //构造一个含有10个存储单元的存储空间的空顺序表
        L.insert(0, 'a');
        L.insert(1, 'z');
        L.insert(2, 'd');
        L.insert(3, 'm');
        L.insert(4, 'z');
        L.display();
        int order = L.indexof('z');
        if (order != -1)
            System.out.println("顺序表中第一次出现z数据元素的位置" + order);
        else {
            System.out.println("此顺序表中不包含值为z的数据元素");
        }
        System.out.println("查找表中第3个位置元素值：");
        System.out.println(L.get(3));
        System.out.println("删除表中第3个位置元素值");
        L.remove(3);
        System.out.println("删除成功");
        System.out.println("剩余元素值");
        L.display();
    }

}
